package com.lyz.objectd2;

/**
 * @ClassName GameDemo
 * @Description 多态案例
 * @Author 2214361854
 * @Date 2022/2/19 13:14
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 方法调用：编译看左，运行看右
         * 变量调用：编译/运行都看左
         * （多态侧重行为多态）
         */
        Animal a1 = new Dog();
        Dog a2 = new Dog();
        Tortoise a3 = new Tortoise();
        //方法运行看右边
        a1.run();
        a2.run();
        a3.run();
        //变量运行看左边
        System.out.println(a1.name);
        System.out.println(a2.name);
        System.out.println(a3.name);
        System.out.println("==================");

        //调用方法
        go(a1);
        go(a2);
        go(a3);
        System.out.println("==================");

          //自动类型转换
          Animal b1 = new Dog();
          b1.run();
//        多态下不能直接使用子类的独有功能
//          b.lookDoor();

        //强制类型转换 就可以使用子类的独有功能
         Animal b2 = new Tortoise();
         b2.run();

        //更安全的使用引用类型强制转换
        if(b2 instanceof Tortoise){
           Tortoise t = (Tortoise)b2;
           t.lookDoor();
        }else if (a2 instanceof Dog){
            Dog dog = new Dog();
            dog.lookDoor();
        }

    }

    /**
     * Animal 所有子类都可以进入方法
     * @param a
     */
    public static void go(Animal a){
        System.out.println("运行："+a);
    }
}
